require('es6-promise').polyfill()
// 验证工具
export default class validateUtil {
  // 空（字符串,对象，数组）（validate）
  static isNull(data) {
    return (data === null || data === '' || data === undefined || JSON.stringify(data) == '{}' || this.isEmptyArray(data))
  };

  // 非空（validate）
  static isNotNull(data) {
    return !this.isNull(data)
  };

  // 第一个字符小写（validate）
  static firstCharLow(data) {
    if (this.isNotNull(data)) { return data.slice(0, 1).toLowerCase() + data.slice(1, data.length) }
  };

  // 第一个字符小写（validate）
  static firstCharUpr(data) {
    if (this.isNotNull(data)) { return data.slice(0, 1).toUpperCase() + data.slice(1, data.length) }
  };

  // 转换为驼峰（validate）
  static toCamel(name) {
    return name.replace(/\_(\w)/g, function (all, letter) {
      return letter.toUpperCase()
    })
  }

  // 转换为下划线（validate）
  static toStrip(name) {
    return name.replace(/([A-Z])/g, '_$1').toLowerCase()
  }

  // 方法
  static isFunction(obj) {
    return (obj && (typeof obj === 'function'))
  };

  // 字符串
  static isString(obj) {
    return (obj && (typeof obj === 'string'))
  };

  // 空对象
  static isNullObj(obj) {
    return JSON.stringify(obj) == '{}'
  };

  // 数组（validate）
  static isArray(obj) {
    return (Object.prototype.toString.call(obj) === '[object Array]')
  };

  // 对象
  static isObject(obj) {
    return (obj && typeof obj === 'object')
  };

  static isResult(result) {
    return this.isNotNull(result) && this.isObject(result)
  };

  static isNullResult(result) {
    return this.isNotNull(result) && this.isObject(result) && JSON.stringify(result) === '{}'
  };

  static isNotNullResult(result) {
    return this.isNotNull(result) && this.isObject(result) && !(JSON.stringify(result) === '{}')
  };

  // 空数组
  static isEmptyArray(obj) {
    return (this.isArray(obj) && obj.length == 0)
  };

  // 是否相等
  static isEqual(attrName, attrArry) {
    var attr = attrArry.split('\|')
    for (var i = 0; i < attr.length; i++) {
      if (attrName.toLowerCase() == attr[i].toLowerCase()) { return true }
    }
    return false
  };

  // 数字（validate）
  static isNumber(value) {
    return /(0|^[1-9]\d*$)/.test(value)
  };

  // 是否拥有属性
  static hasPrototype(object, name) {
    try {
      return object.hasOwnProperty(name) && (name in object)
    } catch (err) {
      return false
    }
  };

  // 获取key
  static getKey(obj) {
    const arr = []
    for (const i in obj) { arr.push(i) }
    return arr
  };

  // 是否包含子串
  static contain(str, subStr) {
    var attr = subStr.split('\|')
    for (var i = 0; i < attr.length; i++) {
      if (str.toLowerCase().indexOf(attr[i].toLowerCase()) >= 0) { return true }
    }
    return false
  };

  // static checkReg(regName, str) {
  //   var regExp = eval("REG.regExp." + regName);
  //   return regExp.test(str);
  // };

  // TODO：以什么结尾
  static endWiths(strTarget, str) {
    var reg = new RegExp(str + '$')
    return reg.test(strTarget)
  };

  // TODO：以什么开头
  static startWith(strTarget, str) {
    var reg = new RegExp('^' + str)
    return reg.test(strTarget)
  };

  // 增加substring字符串截取方法
  static subStr(str, start, end) {
    return str.substring(start, end)
  }

  // ToString
  static toString(obj) {
    return JSON.stringify(obj)
  };

  // TOJSON
  static toJson(str) {
    return JSON.toJson(str)
  };

  // 是否为手机号
  static isMobilPhone(phoneNumber) {
    const reg = /^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/
    return reg.test(phoneNumber)
  };

  // 是否为座机
  static isTelPhone(phoneNumber) {
    const reg = /^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$/
    return reg.test(phoneNumber)
  };

  // 是否为IP
  static isIP(ip) {
    var reSpaceCheck = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/
    if (reSpaceCheck.test(ip)) {
      ip.match(reSpaceCheck)
      if (RegExp.$1 <= 255 && RegExp.$1 >= 0 && RegExp.$2 <= 255 && RegExp.$2 >= 0 && RegExp.$3 <= 255 && RegExp.$3 >= 0 && RegExp.$4 <= 255 && RegExp.$4 >= 0) {
        return true
      }
      return false
    }
    return false
  }

  // 是否为Url
  static isUrl(url) {
    var reg = /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/
    return reg.test(url)
  }

  // 是身份证身份证
  static isIDCard(idCard) {
    const reg = /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/
    return reg.test(idCard)
  };

  // 是否为中文字符
  static isChineseCharacter(str) {
    var reg = /^[\u4e00-\u9fa5]{0,}$/
    return reg.test(str)
  }

  // 是否为年月日,默认-
  static isDate(dateValue) {
    var result = dateValue.match(/((^((1[8-9]\d{2})|([2-9]\d{3}))(-)(10|12|0?[13578])(-)(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))(-)(11|0?[469])(-)(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\d{2})|([2-9]\d{3}))(-)(0?2)(-)(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)(-)(0?2)(-)(29)$)|(^([3579][26]00)(-)(0?2)(-)(29)$)|(^([1][89][0][48])(-)(0?2)(-)(29)$)|(^([2-9][0-9][0][48])(-)(0?2)(-)(29)$)|(^([1][89][2468][048])(-)(0?2)(-)(29)$)|(^([2-9][0-9][2468][048])(-)(0?2)(-)(29)$)|(^([1][89][13579][26])(-)(0?2)(-)(29)$)|(^([2-9][0-9][13579][26])(-)(0?2)(-)(29)$))/)
    if (result == null) { return false }
    return true
  }

  // 是否为Email
  static isEmail(Email) {
    const reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/
    return reg.test(Email)
  };

  // 是否为中文名字
  static isRealName(realName) {
    const reg = /^[\u4e00-\u9fa5]{2,16}$/
    return reg.test(realName)
  };

  // 是否为用户名
  static isUserName(userName) {
    const reg = /^[\w\_]{6,20}$/
    return reg.test(userName)
  };

  // 是否为价格
  static isPrice(price) {
    const reg = /^(?:d+|d+.d{0,2})$/
    return reg.test(price)
  };

  // 是否为移动端浏览器(true:是 false:否)
  static isMobilExplore() {
    const sUserAgent = window.navigator.userAgent
    const mobileAgents = ['Android', 'iPhone', 'Symbian', 'WindowsPhone', 'iPod', 'BlackBerry', 'Windows CE']
    for (let i = 0; i < mobileAgents.length; i++) {
      if (sUserAgent.indexOf(mobileAgents[i]) > -1) {
        return true
        break
      }
    }
    return false
  };

  // 是否为字母
  static isLetter(str) {
    var reg = /(^[A-Za-z]+$)/
    return reg.test(str)
  }

  // 正整数
  static isPositiveInt(str) {
    var reg = /^[0-9]*[1-9][0-9]*$/
    return reg.test(str)
  }

  static isLetterNUm(str) {
    var reg = /(^[A-Za-z0-9]+$)/
    return reg.test(str)
  };

  // 是否为图片
  static isImg(str) {
    var reg = (/(\.jpg|\.jpeg|\.gif|\.png|\.bmp)$/i)
    return reg.test(str)
  }

  static IsTime(str) {
    var reg = /^((20|21|22|23|[0-1]\d)\:[0-5][0-9])(\:[0-5][0-9])?$/
    return reg.test(str)
  }

  // 是否为车牌号
  static isCarCard(str) {
    var reg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/
    return reg.test(str)
  }

  // 是否为微信号
  static isWeChatAccount(str) {
    var reg = /^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/
    return reg.test(str)
  }

  // 是否为QQ号
  static isQQAccount(str) {
    var reg = /^[1-9][0-9]{4,10}$/
    return reg.test(str)
  }

  // 是否为颜色
  static isRGBColor(str) {
    var reg = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
    return cPattern.test(str)
  }

  // 密码强度
  static isPasswordStrength(str) {
    var reg = /^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/
    return reg.test(str)
  }

  // 密码强度判断
  static passwordStrength(str) {
    var aLvTxt = ['', '低', '中', '高']
    var lv = 0
    if (str.match(/[a-z]/g)) { lv++ }
    if (str.match(/[0-9]/g)) { lv++ }
    if (str.match(/(.[^a-z0-9])/g)) { lv++ }
    if (str.length < 6) { lv = 0 }
    if (lv > 3) { lv = 3 }
    return aLvTxt[lv]
  }
}
